#ifndef MINICAMERA_H
#define MINICAMERA_H

#include <QMatrix4x4>
#include <QVector3D>
#include <QtMath>

/**
 * @file: MiniCamera.h
 * @author: xingyifan
 * @date: 2023-03-17 21:13
 *
 * @description: 相机类
 */

class MiniCamera
{
protected:
    // 相机属性
    bool m_moving;          // 是否移动
    QVector3D m_front;      // 指向原点的方向
    QVector3D m_up;         // 正交于向前方向的上方
    QVector3D m_right;      // 正交于向前方向的右方
    QVector3D m_worldUp;    // 世界上方项，固定不变 (0, 1, 0)

    // 欧拉角：俯仰角(Pitch)、偏航角(Yaw)和滚转角(Roll)，我们不需要用到滚转角
    float m_distance;   // 到原点的距离
    float m_pitch;      // 与 xz 平面的夹角
    float m_yaw;        // 与 x 轴的夹角
    float m_rate;       // 鼠标移动角速度

public:
    MiniCamera(float distance = 1.0f, float pitch = 0.0f, float yaw = 0.0f);

    QMatrix4x4 GetViewMatrix() const;
    QVector3D GetPosition() const;
    bool GetMoving() const;
    float GetDistance() const;
    float GetPitch() const;
    float GetYaw() const;
    float GetRate() const;

    void SetMoving(bool moving);
    void SetDistance(float d);
    void SetPitch(float pitch);
    void SetYaw(float yaw);

protected:
    // 通过欧拉角计算方向向量
    void UpdateCameraVectors();
};

#endif // MINICAMERA_H
